/*
 * Copyright (c) 2012 SUBSECRETARIA DEFENSORIA DEL ESPACIO PUBLICO - SDEP.
 * All Rights Reserved.
 * This software is the confidential and proprietary information of SDEP
 * Developed By CONSTULT-SOFT S.A, Development Team 2012.
 *
 */
package co.gov.medellin.sdep.sisdep.domain.gestion;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import co.gov.medellin.sdep.sisdep.admin.exception.PersonaException;
import co.gov.medellin.sdep.sisdep.admin.service.IPersonaService;
import co.gov.medellin.sdep.sisdep.common.AppConstants;
import co.gov.medellin.sdep.sisdep.common.OracleHelper;
import co.gov.medellin.sdep.sisdep.domain.BaseController;
import co.gov.medellin.sdep.sisdep.domain.MessageModalWindowController;
import co.gov.medellin.sdep.sisdep.gestion.exception.EstVisitaDomiciliariaException;
import co.gov.medellin.sdep.sisdep.gestion.exception.EstVisitaDomiciliariaRuntimeException;
import co.gov.medellin.sdep.sisdep.gestion.exception.VehiculoException;
import co.gov.medellin.sdep.sisdep.gestion.service.IEstVisitaDomiciliariaService;
import co.gov.medellin.sdep.sisdep.gestion.service.IVehiculoService;
import co.gov.medellin.sdep.sisdep.integration.mapasmedellin.BeanDireccion;
import co.gov.medellin.sdep.sisdep.integration.mapasmedellin.GeoUbicacionClient;
import co.gov.medellin.sdep.sisdep.model.EstVisitaDomiciliaria;
import co.gov.medellin.sdep.sisdep.model.Persona;
import co.gov.medellin.sdep.sisdep.model.Vehiculo;
import co.gov.medellin.sdep.sisdep.model.comp.EstSocioEconomicoComp;

/**
 * @author Usuario
 * 
 */
public class EstVisitaDomiciliariaController extends BaseController implements
		Serializable {

	/**
	 * generated serial version
	 */
	private static final long serialVersionUID = -3285110767384990403L;

	/**
	 * Constructor por defecto, inicializa los elemento basicos del Controlador
	 */
	public EstVisitaDomiciliariaController() {
		cleanSearchValues();
		cleanValues();
	}

	/** bean para el manejo del formulario de creacion/edicion. EstSocioEconomico */
	private EstSocioEconomicoComp estSocioEconomico = new EstSocioEconomicoComp();

	/** bean para el manejo del formulario de busqueda EstVisitaDomiciliaria */
	private EstVisitaDomiciliaria estVisitaDomiciliariaSearch = new EstVisitaDomiciliaria();

	/** Objeto contenedor del listado de EstVisitaDomiciliaria luego de una consulta. */
	private DataModel estVisitaDomiciliariaListModel;

	/** bean para el manejo del formulario de creacion/edicion. EstVisitaDomiciliaria */
	private EstVisitaDomiciliaria estVisitaDomiciliaria = new EstVisitaDomiciliaria();

	/** instancia de servicio estVisitaDomiciliariaService */
	private IEstVisitaDomiciliariaService estVisitaDomiciliariaService;

	/** instancia de servicio personaService */
	private IPersonaService personaService;
	
	/** instancia de servicio vehiculoService */
	private IVehiculoService vehiculoService;

	/** instancia de servicio vehiculoService */
	private Persona personaRegistradaESE = new Persona();
	
	/** instancia de servicio vehiculoService */
	private Persona personaAsignada = new Persona();

	/**
	 * instancia un objeto de direccion local, en caso que el usuario no valide
	 * direccion al menos una vez
	 */
	private BeanDireccion direccionLocal = new BeanDireccion();
	
	/** cliente de consulta mapas medellin */
	private GeoUbicacionClient geoUbicacionClient;

	// --------------------------------------------------------------------
	// --- metodos para atender acciones init()
	// --------------------------------------------------------------------

	/**
	 * valida solo las personas registradas con motivo de registro asociado
	 * a trabajo con gestion social - estudio socio economico
	 */
	public String checkVehicle() {
		if (getEstVisitaDomiciliaria().getVehiculo().getPlaca() != null && 
				getEstVisitaDomiciliaria().getVehiculo().getPlaca().length() > 0) {
			//Verificamos si el vehiculo se encuenra registrado
			try {
				Vehiculo vehiculoRegistrado = new Vehiculo();
				vehiculoRegistrado = getVehiculoService().findByRelated(getEstVisitaDomiciliaria().getVehiculo().getPlaca());
				if(vehiculoRegistrado != null){
					getEstVisitaDomiciliaria().setVehiculo(vehiculoRegistrado);
				}else{
					getEstVisitaDomiciliaria().setVehiculo(null);
				}
			} catch (VehiculoException e) {
				e.printStackTrace(System.err);
			}
		}else{
			//limpia el valor contenido del vehiculo
			getEstVisitaDomiciliaria().setVehiculo(null);
		}
		if(null == getEstVisitaDomiciliaria().getVehiculo()) {
			getEstVisitaDomiciliaria().setVehiculo(new Vehiculo());
			getEstVisitaDomiciliaria().getVehiculo().setId(null);
			getEstVisitaDomiciliaria().getVehiculo().setPlaca("N/A");
			getEstVisitaDomiciliaria().getVehiculo().setMunicipio("N/A");
			getEstVisitaDomiciliaria().getVehiculo().setCapacidad("N/A");
			getEstVisitaDomiciliaria().getVehiculo().setEstado("N/A");
		}
		return "";
	}	
	
	/**
	 * valida solo las personas registradas con motivo de registro asociado
	 * a trabajo con gestion social - estudio socio economico
	 */
	public String checkPersonaRegistradaESE() {
		if (getPersonaRegistradaESE().getIdTipoIdentificacionStr() != null && 
				getPersonaRegistradaESE().getIdTipoIdentificacionStr().length() > 0
				&& getPersonaRegistradaESE().getIdentificacion() != null && 
				getPersonaRegistradaESE().getIdentificacion().length() > 0) {
			//Verificamos si la persona se encuentra registrada
			try {
				//Busqueda por tipo identificacion e identificacion
				personaRegistradaESE = getPersonaService().findByRelated(getPersonaRegistradaESE());
				getEstVisitaDomiciliaria().setPersona(personaRegistradaESE);
				//Establecemos el identificador de la persona validada
				//como nuevo titular
				if(personaRegistradaESE != null){
					getEstVisitaDomiciliaria().setIdPersonaVisita(personaRegistradaESE.getId());
				}
			} catch (PersonaException e) {
				e.printStackTrace(System.err);
			}
		}		
		if(null == getPersonaRegistradaESE()) {
			setPersonaRegistradaESE(new Persona());
			getPersonaRegistradaESE().setPrimerNombre("N/A");
			getPersonaRegistradaESE().setSegundoNombre("N/A");
			getPersonaRegistradaESE().setPrimerApellido("N/A");
			getPersonaRegistradaESE().setSegundoApellido("N/A");
		}
		return "";
	}	
	
	public String checkPersonaAsignada() {
		if (getPersonaAsignada().getIdTipoIdentificacionStr() != null && 
				getPersonaAsignada().getIdTipoIdentificacionStr().length() > 0
				&& getPersonaAsignada().getIdentificacion() != null && 
				getPersonaAsignada().getIdentificacion().length() > 0) {
			//Verificamos si la persona se encuentra registrada
			//NOTA:
			//Las personas registradas para este proposito
			//se deben registrar con motivo trabajo estudios sociales
			try {
				//Busqueda por tipo identificacion e identificacion
				personaAsignada = getPersonaService().findByRelated(getPersonaAsignada());
				//Establecemos el identificador de la persona validada
				//como nuevo titular
				if(personaAsignada != null){
					getEstVisitaDomiciliariaSearch().setPersona(personaAsignada);
					getEstVisitaDomiciliariaSearch().setIdPersonaVisita(personaAsignada.getId());
				}else{
					getEstVisitaDomiciliariaSearch().setPersona(new Persona());
				}
			} catch (PersonaException e) {
				e.printStackTrace(System.err);
			}
		}
		if(null == getPersonaAsignada()) {
			getEstVisitaDomiciliariaSearch().setPersona(new Persona());
			getEstVisitaDomiciliariaSearch().getPersona().setPrimerNombre("N/A");
			getEstVisitaDomiciliariaSearch().getPersona().setSegundoNombre("N/A");
			getEstVisitaDomiciliariaSearch().getPersona().setPrimerApellido("N/A");
			getEstVisitaDomiciliariaSearch().getPersona().setSegundoApellido("N/A");
			setPersonaAsignada(new Persona());
		}
		return "";
	}

	public String checkAddress() {
		direccionLocal = getGeoUbicacionClient().getAddressLocalization(this.estVisitaDomiciliaria.getDireccionVisita());
		if (null == direccionLocal) {
			direccionLocal = new BeanDireccion();
		}
		estVisitaDomiciliaria.setCodigoBarrio(OracleHelper.isNullorEmpty(direccionLocal
				.getCodBarrio()) ? "N/A" : direccionLocal.getCodBarrio());
		estVisitaDomiciliaria.setBarrio(OracleHelper.isNullorEmpty(direccionLocal
				.getValueNomBarrio()) ? "NO Disponible" : direccionLocal
				.getValueNomBarrio());
		estVisitaDomiciliaria.setCodigoComuna(OracleHelper.isNullorEmpty(direccionLocal
				.getCodComuna()) ? "N/A" : direccionLocal.getCodComuna());
		estVisitaDomiciliaria.setComuna(OracleHelper.isNullorEmpty(direccionLocal
				.getValueNomComuna()) ? "NO Disponible" : direccionLocal
				.getValueNomComuna());

		return "";
	}
	
	/**
	 * 
	 * @return String
	 */
	public String searchEstVisitaDomiciliariaByKey() {
		String msg = "";
		Persona persona = null;
		try {
			
			if ((getPersonaAsignada().getIdTipoIdentificacionStr() != null && getPersonaAsignada()
					.getIdTipoIdentificacionStr().length() > 0)
					&& (getPersonaAsignada().getIdentificacion() != null && getPersonaAsignada()
							.getIdentificacion().length() > 0)) {
				// Verificamos si la persona se encuentra registrada

				try {
					// Busqueda por tipo identificacion e identificacion
					persona = getPersonaService().findByRelated(
							getPersonaAsignada());
					getEstVisitaDomiciliariaSearch().setIdPersonaVisita(persona.getId());
				} catch (PersonaException e) {
					e.printStackTrace(System.err);
				}
			}
			
			
			List valores = null;
			valores = getEstVisitaDomiciliariaService().load(1, 10,
					this.estVisitaDomiciliariaSearch);
			this.estVisitaDomiciliariaListModel.setWrappedData(valores);
		} catch (Exception e) {
			msg = e.getMessage();
			e.printStackTrace(System.err);
		}
		if (this.estVisitaDomiciliariaListModel.getWrappedData() == null) {
			if(msg.equals("")){
				msg = AppConstants.NO_RECORDS_FOUND;
			}
		} else {
			if (((List) this.estVisitaDomiciliariaListModel.getWrappedData()).isEmpty()) {
				msg = AppConstants.NO_RECORDS_FOUND;
			}
		}
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage(msg, null, null);
		return AppConstants.EST_VISITA_DOMICILIARIA_SEARCH_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String create() {
		String msg = AppConstants.DEFAULT_ERROR;
		Persona persona = null;
		try {

			if (this.estVisitaDomiciliaria.getId().longValue() == 0L) {

				if ((getPersonaRegistradaESE().getIdTipoIdentificacionStr() != null && getPersonaRegistradaESE()
						.getIdTipoIdentificacionStr().length() > 0)
						&& (getPersonaRegistradaESE().getIdentificacion() != null && getPersonaRegistradaESE()
								.getIdentificacion().length() > 0)) {
					// Verificamos si la persona se encuentra registrada

					try {
						// Busqueda por tipo identificacion e identificacion
						persona = getPersonaService().findByRelated(
								getPersonaRegistradaESE());
						getEstVisitaDomiciliaria().setIdPersonaVisita(persona.getId());
					} catch (PersonaException e) {
						e.printStackTrace(System.err);
					}
				}
				
				getEstVisitaDomiciliariaService().insert(this.estVisitaDomiciliaria);
				msg = AppConstants.SUCCESS_CREATE;
			}
		} catch (EstVisitaDomiciliariaException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (EstVisitaDomiciliariaRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		cleanValues();
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage("- Estudio Socio Econ\u00EDmico - Visita Domiciliaria " + msg, null, null);
		return AppConstants.EST_VISITA_DOMICILIARIA_SEARCH_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String update() {
		String msg = AppConstants.DEFAULT_ERROR;
		Persona persona = null;
		try {
			if (this.estVisitaDomiciliaria.getId().longValue() != 0L) {
				
				if ((getPersonaRegistradaESE().getIdTipoIdentificacionStr() != null && getPersonaRegistradaESE()
						.getIdTipoIdentificacionStr().length() > 0)
						&& (getPersonaRegistradaESE().getIdentificacion() != null && getPersonaRegistradaESE()
								.getIdentificacion().length() > 0)) {
					// Verificamos si la persona se encuentra registrada

					try {
						// Busqueda por tipo identificacion e identificacion
						persona = getPersonaService().findByRelated(
								getPersonaRegistradaESE());
						getEstVisitaDomiciliaria().setIdPersonaVisita(persona.getId());
					} catch (PersonaException e) {
						e.printStackTrace(System.err);
					}
				}
				
				getEstVisitaDomiciliariaService().update(this.estVisitaDomiciliaria);
				msg = AppConstants.SUCCESS_UPDATE;
			}
		} catch (EstVisitaDomiciliariaException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (EstVisitaDomiciliariaRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		cleanValues();
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage("- Estudio Socio Econ\u00EDmico - Visita Domiciliaria " + msg, null, null);
		return AppConstants.EST_VISITA_DOMICILIARIA_SEARCH_VIEW;
	}

	// --------------------------------------------------------------------
	// --- metodos para atender acciones end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public String createEstVisitaDomiciliaria() {
		estVisitaDomiciliaria = new EstVisitaDomiciliaria();
		cleanValues();
		//Asignamos el estudio socio economico padre
		setEstSocioEconomico((EstSocioEconomicoComp) getSessionObject("estSocioEconomico"));
		if(getEstSocioEconomico() == null){
			return AppConstants.EST_SOCIO_ECONOMICO_SEARCH_VIEW;
		}
		getEstVisitaDomiciliaria().setIdESocioEconomico(getEstSocioEconomico().getId());
		return AppConstants.EST_VISITA_DOMICILIARIA_CREATE_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String updateEstVisitaDomiciliaria() {
		Map params = getExternalContext().getRequestParameterMap();
		String estVisitaDomiciliariaDataIndex = (String) params
				.get("estVisitaDomiciliariaDataIndex");
		this.estVisitaDomiciliaria = (EstVisitaDomiciliaria) ((List) this.estVisitaDomiciliariaListModel
				.getWrappedData())
				.get(Integer.parseInt(estVisitaDomiciliariaDataIndex));
		
		setPersonaAsignada(this.estVisitaDomiciliaria.getPersona());
		cleanSearchValues();
		return AppConstants.EST_VISITA_DOMICILIARIA_UPDATE_VIEW;
	}

	/**
	 *
	 * @return
	 */
	public String cancelEstVisitaDomiciliaria() {
		cleanSearchValues();
		return AppConstants.EST_VISITA_DOMICILIARIA_SEARCH_VIEW;
	}

	/**
	 *
	 * @return
	 */
	public String cancelEstVisitaDomiciliariaOpcion() {
		cleanValues();
		cleanSearchValues();
		return AppConstants.EST_VISITA_DOMICILIARIA_CANCEL_VIEW;
	}

	/**
	 * limpia el contenido de los valores que se ingresan para buscar
	 */
	public final void cleanSearchValues() {
		estVisitaDomiciliariaSearch.setIdESocioEconomico(new Long(0L));
		estVisitaDomiciliariaSearch.setIdTipoVisita(new Long(0L));
		estVisitaDomiciliariaSearch.setIdPersonaVisita(new Long(0L));
		estVisitaDomiciliariaSearch.setIdNovedadVisita(new Long(0L));
		estVisitaDomiciliariaSearch.setEstado("");
		estVisitaDomiciliariaSearch.getPersona().setIdTipoIdentificacionStr("");
		estVisitaDomiciliariaSearch.getPersona().setIdentificacion("");
		setPersonaAsignada(new Persona());
	}

	/**
	 * limpia el contenido de los valores que se ingresan (Create, Update)
	 */
	public final void cleanValues(){
		estVisitaDomiciliaria.setId(new Long(0L));
		estVisitaDomiciliaria.setIdESocioEconomico(new Long(0L));
		estVisitaDomiciliaria.setIdTipoVisita(new Long(0L));
		estVisitaDomiciliaria.setIdPersonaVisita(new Long(0L));
		estVisitaDomiciliaria.setHoraAsignacion("");
		estVisitaDomiciliaria.setIdVehiculo(new Long(0L));
		estVisitaDomiciliaria.setVehiculoPlaca("");
		estVisitaDomiciliaria.setVehiculoPlacaCiudad("");
		estVisitaDomiciliaria.setDireccionVisita("");
		estVisitaDomiciliaria.setCodigoBarrio("");
		estVisitaDomiciliaria.setBarrio("");
		estVisitaDomiciliaria.setCodigoComuna("");
		estVisitaDomiciliaria.setComuna("");
		estVisitaDomiciliaria.setTelefonoDomicilio("");
		estVisitaDomiciliaria.setLugarCercanoReferencia("");
		estVisitaDomiciliaria.setTelefonoReferencia("");
		estVisitaDomiciliaria.setIdNovedadVisita(new Long(0L));
		estVisitaDomiciliaria.setObservacionNovedad("");
		estVisitaDomiciliaria.setConstataInformacion("");
		estVisitaDomiciliaria.setIdTipoConcepto(new Long(0L));
		estVisitaDomiciliaria.setConcepto("");
		estVisitaDomiciliaria.setObservacion("");
		estVisitaDomiciliaria.setEstado("");
		estVisitaDomiciliaria.getPersona().setIdTipoIdentificacionStr("");
		estVisitaDomiciliaria.getPersona().setIdentificacion("");
		setPersonaRegistradaESE(new Persona());
		this.estVisitaDomiciliariaListModel = new ListDataModel();
	}

	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- getters and setters init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public EstVisitaDomiciliaria getEstVisitaDomiciliariaSearch() {
		return estVisitaDomiciliariaSearch;
	}

	/**
	 * 
	 * @param estVisitaDomiciliariaSearch
	 */
	public void setestVisitaDomiciliariaSearch(EstVisitaDomiciliaria estVisitaDomiciliariaSearch) {
		this.estVisitaDomiciliariaSearch = estVisitaDomiciliariaSearch;
	}

	/**
	 * 
	 * @return
	 */
	public DataModel getestVisitaDomiciliariaListModel() {
		return estVisitaDomiciliariaListModel;
	}

	/**
	 * 
	 * @param estVisitaDomiciliariaListModel
	 */
	public void setestVisitaDomiciliariaListModel(DataModel estVisitaDomiciliariaListModel) {
		this.estVisitaDomiciliariaListModel = estVisitaDomiciliariaListModel;
	}

	/**
	 * 
	 * @return
	 */
	public EstVisitaDomiciliaria getEstVisitaDomiciliaria() {
		return estVisitaDomiciliaria;
	}

	/**
	 * 
	 * @param estVisitaDomiciliaria
	 */
	public void setestVisitaDomiciliaria(EstVisitaDomiciliaria estVisitaDomiciliaria) {
		this.estVisitaDomiciliaria = estVisitaDomiciliaria;
	}

	/**
	 * obtencion del servicio estVisitaDomiciliariaService
	 * 
	 * @return
	 */
	public IEstVisitaDomiciliariaService getEstVisitaDomiciliariaService() {
		return estVisitaDomiciliariaService;
	}

	/**
	 * establecimiento del servicio estVisitaDomiciliariaService, la inyeccion de la
	 * dependencia la cubre SpringFramework
	 * 
	 * @param estVisitaDomiciliariaService
	 */
	public void setEstVisitaDomiciliariaService(
			IEstVisitaDomiciliariaService estVisitaDomiciliariaService) {
		this.estVisitaDomiciliariaService = estVisitaDomiciliariaService;
	}

	public IPersonaService getPersonaService() {
		return personaService;
	}

	public void setPersonaService(IPersonaService personaService) {
		this.personaService = personaService;
	}

	public GeoUbicacionClient getGeoUbicacionClient() {
		return geoUbicacionClient;
	}

	public void setGeoUbicacionClient(GeoUbicacionClient geoUbicacionClient) {
		this.geoUbicacionClient = geoUbicacionClient;
	}

	public EstSocioEconomicoComp getEstSocioEconomico() {
		return estSocioEconomico;
	}

	public void setEstSocioEconomico(EstSocioEconomicoComp estSocioEconomico) {
		this.estSocioEconomico = estSocioEconomico;
	}

	public IVehiculoService getVehiculoService() {
		return vehiculoService;
	}

	public void setVehiculoService(IVehiculoService vehiculoService) {
		this.vehiculoService = vehiculoService;
	}

	public Persona getPersonaRegistradaESE() {
		return personaRegistradaESE;
	}

	public void setPersonaRegistradaESE(Persona personaRegistradaESE) {
		this.personaRegistradaESE = personaRegistradaESE;
	}

	public Persona getPersonaAsignada() {
		return personaAsignada;
	}

	public void setPersonaAsignada(Persona personaAsignada) {
		this.personaAsignada = personaAsignada;
	}
	
	// --------------------------------------------------------------------
	// --- getters and setters end()
	// --------------------------------------------------------------------

}
